/**
* @file drv_lcd.h
* @brief  lcd manage layer
* @details 
* @author huangbin
* @version V1.0.0
* @date 2025-04-20
* @copyright All documents are copyrighted by Shenzhen Xinlongwei Technology Co., LTD.
*            They may not be used for commercial purposes without permission
*/
#ifndef __DRV_LCD_H__
#define	__DRV_LCD_H__
#include "inc.h"

#ifdef __cplusplus
 extern "C" {
#endif /* __cplusplus */
////////////////////////////////////////////////////////////////////////////////////
/**
* @brief screen对象定义 
* @details 可以同时支持多个屏幕显示
*/ 
typedef enum
{
	SCREEN_SUB1,
	SCREEN_SUB2,
	SCREEN_SUB3,
	SCREEN_SUB4,
	SCREEN_MAX,		/*!<允许的最大屏幕*/
}SCREEN_Type;

typedef enum
{
	LCD_BACKLIGHT_TYPE_3V3,		/*!<单个LED并联*/
	LCD_BACKLIGHT_TYPE_18V,		/*!<多个LED串联*/
}LCD_BK_TYPE;

#define GUI_COLOR_16BIT 0
#define GUI_COLOR_24BIT 1

#define GUI_COLOR_DEPTH  GUI_COLOR_16BIT  //当前gui使用的颜色深度

#if GUI_COLOR_DEPTH == GUI_COLOR_24BIT
/**
* @brief COLOR type define 
* @details gui系统颜色统一使用32bit，单一的屏幕使用多少位，由驱动决定。如果要加速，也可以改变这里定义和lcd直接匹配
*/
    #define HCOLOR	uint32_t
    #define	MAKE_COLOR(r,g,b)   (((uint32_t)(r)  << 16) |((uint32_t)(g)  << 8)  | ((uint32_t)(b)  << 0) )    /*!<rrrrrrrr,gggggggg,bbbbbbbb */
    #define	GET_COLOR_R(c)  	((uint8_t)((c) >> 16))
    #define	GET_COLOR_G(c)  	((uint8_t)((c) >> 8))
    #define	GET_COLOR_B(c)  	((uint8_t)((c) >> 0))
#endif

#if GUI_COLOR_DEPTH == GUI_COLOR_16BIT
    #define HCOLOR	uint16_t
    #define	MAKE_COLOR(r,g,b)   ((((uint16_t)((r) >> 3)) << 11) | (((uint16_t)((g) >> 2)) << 5) | ((uint16_t)((b) >> 3)))   /*!<rrrrrggg,gggbbbbb*/
#endif
/**
* @brief 标准颜色定义 
* @details 传统的标准颜色
*/
#define COLOR_WHITE		MAKE_COLOR(255,255,255) /*!<白色*/
#define COLOR_BLACK		MAKE_COLOR(0,0,0)		/*!<黑色*/
#define COLOR_RED		MAKE_COLOR(255,0,0)		/*!<红色*/
#define COLOR_GREEN		MAKE_COLOR(0,255,0)		/*!<绿色*/
#define COLOR_BLUE		MAKE_COLOR(0,0,255)		/*!<蓝色*/
#define COLOR_YELLOW	MAKE_COLOR(255,255,0)	/*!<黄色*/
#define COLOR_MAGENTA	MAKE_COLOR(255,0,255)	/*!<洋红色*/
#define COLOR_AQUA 		MAKE_COLOR(0,255,255)   /*!<浅绿色*/
#define COLOR_GRAYHALF	MAKE_COLOR(128,128,128) /*!<灰色*/
#define COLOR_PURPLE	MAKE_COLOR(128,0,128)   /*!<紫色*/
#define COLOR_TEAL  	MAKE_COLOR(0,128,128)   /*!<青色*/
#define COLOR_OLIVE 	MAKE_COLOR(128,128,0)   /*!<橄榄绿*/

/**
* @brief TFT类型LCD的标准操作接口 
*/
/**
* @brief 设置窗口的函数原型定义
* @param[in] x0 窗口的起始X位置(必须是在lcd物理分辨率内)
* @param[in] y0 窗口的起始y位置(必须是在lcd物理分辨率内)
* @param[in] x1 窗口的结束x位置(不包含最后一个点)
* @param[in] y1 窗口的结束y位置(不包含最后一个)
*/ 
typedef void (*LcdSetWindow)(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1);
/**
* @brief 写数据到指定的窗口
* @param[in] psrc 显示数据来源
* @param[in] pixels  显示像素数量(不是数据字节数)
*/ 
typedef void (*LcdWriteData)(HCOLOR *psrc,uint32_t pixels);
/**
* @brief 写固定颜色到指定的窗口
* @param[in] color 要写的颜色
* @param[in] pixels 显示像素数量(不是数据字节数)
*/ 
typedef void (*LcdWriteColor)(HCOLOR color,uint32_t pixels);
/**
* @brief 写要操作的当前索引寄存器
* @param[in] reg register index
*/
typedef void (*LcdWriteIndexReg)( uint8_t reg);
/**
* @brief 写当前索引寄存器的参数
* @param[in] parameter register parameter
*/
typedef void (*LcdWriteRegParameter)( uint8_t parameter);
/**
* @brief 向指定寄存器写全部参数
* @param[in] index_reg 寄存器索引
* @param[in] preg_parameter 寄存器参数
* @param[in] len 参数数量
*/
typedef void (*LcdWriteCtrlCommand)(uint8_t index_reg, uint8_t *preg_parameter,uint8_t len);
/**
* @brief 读寄存器参数
* @param[in] index_reg 寄存器索引
* @param[in] preg_parameter 保存寄存器参数
* @param[in] len 参数数量
*/
typedef  void (*LcdReadReg)(uint8_t index_reg,uint8_t *preg_parameter,uint8_t len); /*!<读寄存器数据*/
/**
* @brief LCD休眠控制
* @param[in] sleep true=sleep in,false=sleep out
*/
typedef void (*LcdSleepInOut)(bool sleep); 
/**
* @brief LCD硬件复位
*/
typedef void (*LcdHardReset)(void);
/**
* @brief LCD背光控制
* @param[in] duty 占空比(0-100)，0=off,100=on,other=pwm duty ratio
*/
#define LCD_BACKLIGHT_ON	100
#define LCD_BACKLIGHT_OFF	0
typedef void (*LcdBacklightSet)(uint8_t duty);

typedef struct lcdDriver{
	LcdSetWindow		    SetWindow;
	LcdWriteData		    WriteData;
	LcdWriteColor	        WriteColor;
	LcdSleepInOut	        SleepInOut;
	LcdBacklightSet	        BkSet;
	LcdHardReset		    Reset;
	LcdWriteIndexReg        WriteIndexReg;
	LcdWriteRegParameter    WriteRegParameter;
	LcdWriteCtrlCommand     WriteRegAndParameter;
	LcdReadReg			    ReadReg;
	uint16_t	x,y;		/*!<screen resolution*/
}DRVLCD;
/**
* @brief lcd 设备初始化函数
*/
typedef void lcdDeviceInit(DRVLCD *pLcd);

/**
* @brief 注册lcd设备，并且初始化
* @param[in] screen 要注册的屏幕
* @param[in] init 要注册设备的初始化程序
* @return trun=成功,false=失败
*/
extern bool lcdRegisterDevice(SCREEN_Type screen,lcdDeviceInit init);

/**
* @brief 获取lcd操作指针
* @param[in] screen 已注册的屏幕
* @return DRVLCD 可以操作的设备指针
*/
extern DRVLCD *lcdGetDevicePointer(SCREEN_Type screen);    
/**
* @brief 控制显示设备的背光
* @param[in] screen 已注册的屏幕
* @param[in] duty 背光
*/
extern void lcdBackLightSet(SCREEN_Type screen,uint8_t duty);
/**
* @brief 显示LCD测试图
*/
extern void lcdTestPattern(void);
/**
* @brief 专用于lcd底层的延时函数(阻塞类型的) 
*/
#define LCD_Delay(ms)			HardWareDelay_ms(ms)

//////////////////////////////LCD驱动接口////////////////////////////////////
/**
* @brief 注册lcd的fsmc mcu 8bit,16bit RGB565颜色格式的驱动接口
* @param[in] pLcd DRVLCD管理结构
* @param[in] xOffset x偏移量
* @param[in] yOffset y偏移量
*/
extern void Lcd_RegInterface_FsmcMcu8_16(DRVLCD *pLcd,uint16_t xOffset,uint16_t yOffset);

/**
* @brief 注册lcd的spi4w,16bit RGB565颜色格式的驱动接口
* @param[in] pLcd DRVLCD管理结构
* @param[in] xOffset x偏移量
* @param[in] yOffset y偏移量
*/
extern void Lcd_RegInterface_Spi4_16(DRVLCD *pLcd,uint16_t xOffset,uint16_t yOffset);
///////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif
/************************END OF FILE*********************************************/

